package com.lzp.wechat.common.utils;


import org.apache.commons.lang3.StringUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 微信工具类
 */
public class WeChatUtil {

    // 公众号服务器配置页面的token
    private static final String token = "LZPWECHAT970119";

    /**
     * 验证sha1加密后的字符串是否与signature一致
     *
     * @param signature 微信加密签名
     * @param timestamp 时间戳
     * @param nonce     随机字符串
     * @return 是否来源于微信服务器
     */
    public boolean validParams(String signature, String timestamp, String nonce) {
        // 将token、timestamp、nonce三个参数进行字典序排序
        String[] arr = new String[]{timestamp, nonce, token};
        Arrays.sort(arr);

        // 将三个参数字符串拼接成一个字符串进行sha1加密
        StringBuffer sb = new StringBuffer();
        for (String s : arr) {
            sb.append(s);
        }
        String formattedText = sha1(sb.toString());

        // 获得加密后的字符串可与signature对比，标识该请求来源于微信
        if (StringUtils.equals(formattedText, signature)) {
            return true;
        }
        return false;
    }

    /**
     * 将字符串进行sha1加密
     *
     * @param str 需要加密的字符串
     * @return 加密后的内容
     */
    public String sha1(String str) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-1");
            digest.update(str.getBytes());
            byte messageDigest[] = digest.digest();
            // Create Hex String
            StringBuffer hexString = new StringBuffer();
            // 字节数组转换为 十六进制 数
            for (int i = 0; i < messageDigest.length; i++) {
                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexString.append(0);
                }
                hexString.append(shaHex);
            }
            return hexString.toString();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 解析xml
     */
    public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {
        Map<String, String> map = new HashMap<>();
        // 从request中获取输入流
        InputStream inputStream = request.getInputStream();
        // 读取输入流
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(inputStream);
        // 获取根节点
        Element root = document.getRootElement();
        // 获取根节点的所有子节点
        List<Element> elements = root.elements();
        // 遍历所有子节点元素存入map中
        for (Element element : elements) {
            map.put(element.getName(), element.getText());
        }
        // 释放资源
        inputStream.close();
        return map;
    }
}
